package com.yzy.jvm.method.invoke;

/**
 * 方法静态解析调用
 */
public class StaticDispatch {

    public static abstract class Human {}

    public static class Man extends Human {}

    public static class Woman extends Human {}

    public void sayHello(Human human) {System.out.println("hello, human");}
    public void sayHello(Man man) {System.out.println("hello, man");}
    public void sayHello(Woman woman) {System.out.println("hello, woman");}

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();

        /*
        Human man = new Man();
        对于上面的代码，Human 为改变量的静态类型，或者外观类型，Man称为该变量的实际类型
        虚拟机在重载时是通过参数的静态类型而不是实际类型来来作为判定依据的
         */
        StaticDispatch sd = new StaticDispatch();
        sd.sayHello(man);
        sd.sayHello(woman);

        /**
         * 结果：
         hello, human
         hello, human
         * 原因：
         Human man = new Man();
         对于上面的代码，Human 为该变量的静态类型，或者外观类型，Man称为该变量的实际类型
         虚拟机在重载时是通过参数的静态类型而不是实际类型来来作为判定依据的
         */


    }

}
